﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

using Noris.Schedule.Support.Services;
using System.Drawing;
using System.Windows.Forms;
using Noris.Schedule.Planning.ProcessData;
using Noris.Schedule.Support;
using Noris.Schedule.Support.Green;
using Noris.Schedule.Planning.DataFace;
using Noris.Schedule.Support.Data;

namespace Noris.Schedule.Planning.Services
{
	#region LINKOVÁNÍ VYBRANÝCH ZÁZNAMŮ DO NOVÉ SKUPINY
	internal class FunctionLinkNewGroupCls : IFunctionMenuItem
	{
		/// <summary>
		/// Tady funkce deklaruje, pro které případy chce být vidět v nabídce.
		/// A pokud ano, tak jak se jmenuje, kde v nabídce je a jaký má obrázek.
		/// </summary>
		/// <param name="args"></param>
		/// <returns></returns>
		bool IFunctionMenuItem.IsFunctionSuitableFor(FunctionMenuItemSuitableArgs args)
		{
			// Link lze zadávat jen v grafu TaskCapacityLink pro elementy GraphElement třídy .Constants.ClassNumberWork:
			bool isSuitable1 = (
				args.KeyGraphMode == RowGraphMode.TaskCapacityLink &&
				args.KeyAreaType == FunctionMenuItemAreaType.GraphElement &&
				args.KeyElementClassNumber == Noris.Schedule.Planning.ProcessData.Constants.ClassNumberWork);
			bool isSuitable = isSuitable1;
			if (isSuitable)
			{
				args.MenuCaption = "Linkovat vybrané operace";
				args.MenuToolTipText = "Spojí vybrané operace vztahem Link.\r\nVytvoří pro ně novou skupinu, ze současné skupiny je odebere.";
				args.MenuImage = PicLibrary22.Link_22_FromFile;
				args.MenuGroup = "LINK";
				args.MenuOrder = -239;
				args.EnabledStateDependingOnElement = true;     // Enable závisí na stavu vybraných elementů
			}
			return isSuitable;
		}
		bool IFunctionMenuItem.IsMenuItemEnabledFor(FunctionMenuItemRunArgs args)
		{
			List<DataPointerStr> elements = args.InputElements;      // Seznam všech vybraných elementů (clicked + selected)
			return (elements.Count > 1);
		}
		/// <summary>
		/// Vstupní metoda do výkonné části pluginu
		/// </summary>
		/// <param name="args"></param>
		void IFunctionMenuItem.Run(FunctionMenuItemRunArgs args)
		{
			PlanningDataCls planningData;
			if (!PlanningDataCls.TryGetPlanningData(args.DataSource, out planningData)) return;

			PlanningInteractiveLinkArgs linkArgs = new PlanningInteractiveLinkArgs();
			linkArgs.InputItemsFillFrom(args, true, true);
			linkArgs.LinkSetting = InteractiveLinkSetting.LinkToNewSeparate;

			planningData.InteractiveSetLink(linkArgs);

			linkArgs.ResultCopyTo(args);
		}
	}
	#endregion
	#region LINKOVÁNÍ VYBRANÝCH ZÁZNAMŮ DO SPOLEČNÉ SKUPINY
	internal class FunctionLinkCollectiveCls : IFunctionMenuItem
	{
		/// <summary>
		/// Tady funkce deklaruje, pro které případy chce být vidět v nabídce.
		/// A pokud ano, tak jak se jmenuje, kde v nabídce je a jaký má obrázek.
		/// </summary>
		/// <param name="args"></param>
		/// <returns></returns>
		bool IFunctionMenuItem.IsFunctionSuitableFor(FunctionMenuItemSuitableArgs args)
		{
			// Link lze zadávat jen v grafu TaskCapacityLink pro elementy GraphElement třídy .Constants.ClassNumberWork:
			bool isSuitable1 = (
				args.KeyGraphMode == RowGraphMode.TaskCapacityLink &&
				args.KeyAreaType == FunctionMenuItemAreaType.GraphElement &&
				args.KeyElementClassNumber == Noris.Schedule.Planning.ProcessData.Constants.ClassNumberWork);
			bool isSuitable = isSuitable1;
			if (isSuitable)
			{
				args.MenuCaption = "Spojit vybrané skupiny operací";
				args.MenuToolTipText = "Spojí vybrané operace do jedné skupiny,\r\na to včetně dalších již nyní navázaných linkovaných operací.";
				args.MenuImage = PicLibrary22.Link_cross_22_FromFile;
				args.MenuGroup = "LINK";
				args.MenuOrder = -238;
				args.EnabledStateDependingOnElement = true;     // Enable závisí na stavu vybraných elementů
			}
			return isSuitable;
		}
		bool IFunctionMenuItem.IsMenuItemEnabledFor(FunctionMenuItemRunArgs args)
		{
			List<DataPointerStr> elements = args.InputElements;      // Seznam všech vybraných elementů (clicked + selected)
			return (elements.Count > 1);
		}
		/// <summary>
		/// Vstupní metoda do výkonné části pluginu
		/// </summary>
		/// <param name="args"></param>
		void IFunctionMenuItem.Run(FunctionMenuItemRunArgs args)
		{
			PlanningDataCls planningData;
			if (!PlanningDataCls.TryGetPlanningData(args.DataSource, out planningData)) return;

			PlanningInteractiveLinkArgs linkArgs = new PlanningInteractiveLinkArgs();
			linkArgs.InputItemsFillFrom(args, true, true);
			linkArgs.LinkSetting = InteractiveLinkSetting.LinkToCollective;

			planningData.InteractiveSetLink(linkArgs);

			linkArgs.ResultCopyTo(args);
		}
	}
	#endregion
	#region ZRUŠENÍ LINKOVÁNÍ VYBRANÝCH ZÁZNAMŮ
	internal class FunctionLinkDetachCls : IFunctionMenuItem
	{
		/// <summary>
		/// Tady funkce deklaruje, pro které případy chce být vidět v nabídce.
		/// A pokud ano, tak jak se jmenuje, kde v nabídce je a jaký má obrázek.
		/// </summary>
		/// <param name="args"></param>
		/// <returns></returns>
		bool IFunctionMenuItem.IsFunctionSuitableFor(FunctionMenuItemSuitableArgs args)
		{
			// Element lze odfixovat pouze na grafu typu TaskCapacityLink (jde o WorkUnit):
			bool isSuitable1 = (
				args.KeyGraphMode == RowGraphMode.TaskCapacityLink &&
				args.KeyAreaType == FunctionMenuItemAreaType.GraphElement &&
				args.KeyElementClassNumber == Noris.Schedule.Planning.ProcessData.Constants.ClassNumberWork);
			bool isSuitable = isSuitable1;
			if (isSuitable)
			{
				args.MenuCaption = "Rozpojit vybrané operace";
				args.MenuToolTipText = "Rozpojí vybrané operace.\r\nOdebere jejich vztah na Link.";
				args.MenuImage = PicLibrary22.Link_broke_22_FromFile;
				args.MenuGroup = "LINK";
				args.MenuOrder = -237;
				args.EnabledStateDependingOnElement = true;     // Enable závisí na stavu vybraných elementů
			}
			return isSuitable;
		}
		/// <summary>
		/// Dotaz, zda má být položka menu "Rozpojit vybrané operace" zobrazena jako enabled nebo disabled
		/// </summary>
		/// <param name="args"></param>
		/// <returns></returns>
		bool IFunctionMenuItem.IsMenuItemEnabledFor(FunctionMenuItemRunArgs args)
		{
			PlanningDataCls planningData;
			if (!PlanningDataCls.TryGetPlanningData(args.DataSource, out planningData)) return false;

			List<DataPointerStr> elements = args.InputElements;      // Seznam všech vybraných elementů (clicked + selected)
			foreach (DataPointerStr pointer in elements)
			{
				// Pokud jakýkoli jeden task, který je majitelem elementu, je v nějaké link skupině, pak vrátím true:
				CapacityPlanWorkItemCls task = planningData.FindTaskC(pointer);
				if (task != null && task.LinkGroup != 0)
					return true;
			}
			return false;
		}
		/// <summary>
		/// Vstupní metoda do výkonné části pluginu
		/// </summary>
		/// <param name="args"></param>
		void IFunctionMenuItem.Run(FunctionMenuItemRunArgs args)
		{
			PlanningDataCls planningData;
			if (!PlanningDataCls.TryGetPlanningData(args.DataSource, out planningData)) return;

			PlanningInteractiveLinkArgs linkArgs = new PlanningInteractiveLinkArgs();
			linkArgs.InputItemsFillFrom(args, true, true);
			linkArgs.LinkSetting = InteractiveLinkSetting.UnLink;

			planningData.InteractiveSetLink(linkArgs);

			linkArgs.ResultCopyTo(args);
		}
	}
	#endregion
}
